package kgame5.kmedia.xplayer {

/**
 * @author Administrator
 * 声音淡出的一个类，是指是在模拟一个用户在每隔100ms就把XPlayer的声音弄小一点
 * 它不参与xplayer的生命周期的事件，因为一个用户是什么也不知道的,只是当调用xplayer.close()的时候这个停止吧就
 * 
 * 经验总结：曾经写过private xplayer:XPlayer
 */
import kgame5.kmath.MathDG;
import kgame5.kutil.*;

import flash.events.*;
import flash.utils.*;

class VolumeFader {
	 
	public static const	MAX_FADEDUR:int=4*1000;//执行声音淡出的操作的时间要是大于4秒，就直接把声音弄成０
	public static const	FADETIMER_DUR:int=100;//控制声音淡出的这个时间是100ms
					
	//______________________Property_______________________
	private var xplayer:XPlayer;
	
	//--声音变淡的控制器
	private var timer_volFade : Timer;
	private var aimVol : Number = 0;
	//______________________Method_________________________
	public function VolumeFader(p_xplayer:XPlayer){
		xplayer=p_xplayer;
	}

	public function start(p_aimVol : Number) : void {
		//T.p("createVolumnFadeTimer",p_aimVol);
		aimVol = p_aimVol;
	
		clear();//在启动之前先clear掉以前的
		
		timer_volFade = new Timer(FADETIMER_DUR);
		timer_volFade.addEventListener(TimerEvent.TIMER, volumeFadeHandler);
		timer_volFade.start();
	}
	//停止自动计时并释放相关资源,这个是当xplayer.close()是时候弄
	public function clear() {
		if(timer_volFade != null) {
			T.p("volumeFade OK!");
			timer_volFade.removeEventListener(TimerEvent.TIMER, volumeFadeHandler);
			timer_volFade.stop();
			timer_volFade = null;
		}
	}

	private function volumeFadeHandler(e : TimerEvent) : void {
		//
		var vol : Number = xplayer.getVol();
		//T.p("volumeFadeHandler:"+vol);
		if(vol == aimVol 
			||  xplayer.IsPlayComplete() 
			||  xplayer.IsError() 
			|| timer_volFade.currentCount > MAX_FADEDUR / FADETIMER_DUR//如果超过4秒
			) {
			//T.p("volumeFade OK!");
			clear();
			
			return;
		}
		
		//!!这里是特殊用法，注意vol和aimVol都是0~1了，所以用Spring的时候把他们扩大100倍
		vol = MathDG.Spring(vol * 100, aimVol * 100, 3);
		 xplayer.setVol(vol / 100);
		
		//--
		if(vol == 0) {
			//！！这个是非常重要的一点考虑，否则在淡出完毕（音乐卡片退出舞台后），当播放完毕还是要发送"歌曲听完了"的请求的，从而造成了问题，
			 xplayer.pause();
			//thisObj.close();//淡出完毕就关闭,!不能这样，因为还有东西在等待淡出完毕的通知,如果此时sd==null则无法取的声音
		}	
	}
}//end of class
}
